package com.chen.log.aspect;

import com.chen.log.annotation.Log;
import com.chen.log.service.LogAspectService;
import com.chen.log.utils.LogUtil;
import com.chen.model.entity.system.SysOperLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.PessimisticLockingFailureException;

/**
 * @author cgj
 * @date 3/25/25 3:17 PM
 */
@Aspect
public class LogAspect {
    @Autowired
    private LogAspectService logAspectService;
    //第一种方式写 注解的全限定名, 但是没法通过 Log log 拿到参数
     //  参数的层级 比较多
//    @Around("@annotation(com.chen.log.annotation.Log)")
//    public Object doConcurrentOperation(ProceedingJoinPoint pjp, Log log) throws Throwable {
    @Around(value = "@annotation(log)")  //这里的log是随便起的一个变量命
    // 具体的类型是看Log log  ,方法里面形参的类型
    public Object doConcurrentOperation(ProceedingJoinPoint pjp, Log log) throws Throwable {
        // 日志对象, 补充数据完毕后插入到数据库中
        SysOperLog sysOperLog = new SysOperLog();
        LogUtil.beforeHandleLog(log,pjp,sysOperLog);
        //方法执行前收集的数据
        Object proceed = null; //执行被增强的方法
        try {
            proceed = pjp.proceed();
            // 方法执行后收集数据
            //无异常的情况,状态0
            LogUtil.afterHandleLog(log,proceed,sysOperLog,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            String errorMessage=e.toString();
            //有异常的情况 状态1
            LogUtil.afterHandleLog(log,proceed,sysOperLog,1,errorMessage);
            //这里不抛出异常, @transaction 无法进行回滚
            // 调用service添加到数据库
            logAspectService.savaOperLog(sysOperLog);
            throw  new Exception();
        }


        return proceed;
    }
}
